package com.apache.match.common;

import com.apache.api.vo.ResultEntity;
import com.apache.cache.service.impl.LoadCacheFactory;
import com.apache.cache.util.Validator;
import com.apache.client.UctProtoclClient;
import com.apache.database.datasource.ConnctionData;
import com.apache.funds.common.FundsUtil;
import com.apache.rpc.entity.InterfaceRegister;
import com.apache.rpc.entity.RpcDatasource;
import com.apache.tools.ConfigUtil;
import com.apache.tools.MD5Utils;
import com.apache.tools.StrUtil;
import com.apache.uct.common.ToolsUtil;
import net.sf.json.JSONObject;

import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;

public class Constant {


    /**
     * 成交状态
     */
    public static class DEAL_STATUS {

        /**
         * 暂存
         */
        public static final String TEMP = "0";

        /**
         * 审核退回,审核不通过
         */
        public static final String AUDIT_RETURN = "1";

        /**
         * 已提交审核
         */
        public static final String SUBMIT_AUDIT = "10";

        /**
         * 审核通过
         */
        public static final String SHOULI = "30";

        /**
         * 价款划入凭单已生成
         */
        public static final String BILL_IN_CREATE = "40";

        /**
         * 价款划入凭单已审核通过
         */
        public static final String BILL_IN_OK = "50";

        /**
         * 价款划入凭单付款完成待确认
         */
        public static final String BILL_IN_PAY_FINISH = "55";

        /**
         * 价款划入凭单已确认结算完成
         */
        public static final String BILL_IN_FINISH = "60";

        /**
         * 价款划出凭单已生成
         */
        public static final String BILL_OUT_CREATE = "70";

        /**
         * 价款划出凭单已审核通过
         */
        public static final String BILL_OUT_OK = "80";

        /**
         * 价款划出凭单已确认结算完成
         */
        public static final String BILL_OUT_FINISH = "90";

        /**
         * 价款划出 出纳完成
         */
        public static final String BILL_END = "100";
    }

    /**
     * 成交状态
     */
    public static class DEAL_STATUS_BJTE {

        /**
         * 待支付保证金
         */
        public static final String BILL_DZFBZJ = "30";

        /**
         * 待验货
         */
        public static final String BILL_DYH = "60";

        /**
         * 待支付剩余货款
         */
        public static final String BILL_DZFHK = "65";

        /**
         * 交收完成
         */
        public static final String BILL_JSWC = "70";

        /**
         * 待提货
         */
        public static final String BILL_DTH = "80";

        /**
         * 已提货
         */
        public static final String BILL_YTH = "85";

    }

    /**
     * 虚拟资金钱包模板编码编码
     */
    public static class Funds {

        /**
         * 入金 有效增加 m1+
         **/
        public static final String FINT = "FINT";

        /**
         * 出金 有效增加 m1-
         **/
        public static final String FOUT = "FOUT";

        /**
         * 冻结 有效→冻结 (m1→m2)
         **/
        public static final String PBOD = "PBOD";

        /**
         * 解冻 冻结→有效 (m2→m1)
         **/
        public static final String CBOD = "CBOD";

        /**
         * 直接交割 买方m2→卖方m1
         **/
        public static final String DELV = "DELV";

        /**
         * 本行交割(T+N) 买方→卖方(T+N)
         **/
        public static final String TBDV = "TBDV";

        /**
         * 交割给平台 买方冻结→交易所 (买方m2→交易所m1)
         **/
        public static final String FBDV = "FBDV";

        /**
         * 有效资金互相交割 m1->m1
         **/
        public static final String FADV = "FADV";

        /**
         * 买方移动 冻结→手续费 (自己的冻结m2→自己的手续费m6)
         **/
        public static final String TFBM = "TFBM";

        /**
         * 本行卖方移动 （自己的可用m1→自己的手续费m6）
         **/
        public static final String TFSM = "TFSM";

        /**
         * 手续费交割 （自己的手续费m6→交易所m1）
         **/
        public static final String FEDV = "FEDV";

        /**
         * 补交手续费 （自己的可用m1→自己的手续费m6）
         **/
        public static final String APFE = "APFE";
    }

    public static String getDatabaseType(String sysEname) {
        String key = "rpc_datasource_" + sysEname;
        Object obj = LoadCacheFactory.getInstance().getCacheManager("").getCacheObjectByKey(key);
        if (null == obj) {
            return null;
        }
        RpcDatasource rds = (RpcDatasource) obj;
        return ConnctionData.getInstance().getDataBaseType(null, rds.getDriverClassName(), "");
    }

    /**
     * 撮合成交价价格计算方法：<br/>
     * 撮合成交的前提是：买入价（A）必须大于或等于卖出价（B），即A>=B。<br/>
     * 计算依据：计算机在撮合时实际上是依据前一笔成交价而定出最新成交价的。<br/>
     * 假设：前一笔的成交价格为C，最新成交价为D；则，当<br/>
     * A<=C时，D=A；（如果前一笔成交价高于 或等于买入价，则最新成交价就是买入价）<br/>
     * B>=C时，D=B；（如果前一笔成交价低于或等于卖出价，则最新成交价就是卖出价）<br/>
     * B《C《A时，D=C；（如果前一笔成交价在卖出价与买入价 之间，则最新成交价就是前一笔的成交价）<br/>
     * 撮合价的优点：既显示了公平性，又使成交价格具有相对连续性，避免了不必要的无规律跳跃。
     *
     * @param a 买入价
     * @param b 卖出价
     * @param c 前一笔的成交价
     * @return
     */
    public static Long getABCD(long a, long b, long c) {
        long d = 0l;
        if (a > b) {
            if (a <= c) {
                d = a;
            }
            if (b >= c) {
                d = b;
            }
            if (b < c && c < a) {
                d = c;
            }
        } else if (a == b) {
            d = a;
        } else {
            System.out.println("无法撮合匹配！！");
        }
        return d;
    }

    public static String getJysFundsId() {
        String jysFundsId = ConfigUtil.getInstance().getValueByKey("jys_funds_id");
        if (Validator.isNull(jysFundsId)) {
            System.out.println("系统检测到unity_config.properties中未配置jys_funds_id(资金账号)参数值，请先配置！");
        } else {
            ResultEntity entityFunds = FundsUtil.selectFundsMyAccount(jysFundsId);
            if ("true".equals(entityFunds.getResult()) && "false"
                    .equals(entityFunds.getEntity().toString())) {
                System.out.println("系统检测到未开通[" + jysFundsId + "]资金账号，则开始自动开通！！！！");
                Map<String, Object> fundsMap = new HashMap<String, Object>();
                fundsMap.put("userEname", jysFundsId);
                fundsMap.put("userCname", "交易所平台资金账户");
                try {
                    fundsMap.put("password", MD5Utils.crypt(jysFundsId));
                } catch (NoSuchAlgorithmException e) {
                    e.printStackTrace();
                }
                fundsMap.put("createUser", "admin");
                fundsMap.put("createUserName", "admin");
                entityFunds = FundsUtil.doFundsOpenAccount(fundsMap);
                System.out.println("平台资金账号开通结果：" + JSONObject.fromObject(entityFunds));
            }
        }
        return jysFundsId;
    }


}
